/**
 * 实用操作封装
 *
 * @author AshaLiu
 */

import { Dimensions, Platform, PixelRatio, findNodeHandle, UIManager } from 'react-native';

export function type(obj) {
  let class2type = {};
  let toString = class2type.toString;
  //保存tostring，调用{}.tostring.call(obj);或者Object.prototype.tostring.call(obj);获取内置类型
  let hasOwn = class2type.hasOwnProperty;
  //所以class2type[["object Boolean"]:"boolean","[object Number]":"number","[object Function]":"function"]等
  'Boolean Number String Function Array Date RegExp Object Error'.split(' ').forEach(function(name, i) {
    class2type['[object ' + name + ']'] = name.toLowerCase();
  });

  if (obj == null) {
    return obj + '';
  }
  //'如果是object或者function，先查询集合class2type,如果没有查询到就返回object。
  return typeof obj === 'object' || typeof obj === 'function' ? class2type[toString.call(obj)] || 'object' : typeof obj;
}

/**
 * 设置图片size
 * @param src
 * @param size
 * @returns {src}
 */
export function setImgSize(src, size) {
  if (!src) {
    return '';
  } else if (!size) {
    return src;
  } else {
    let nIndex = src.lastIndexOf('.');
    if (nIndex > -1) {
      src = src.substr(0, nIndex) + '-' + size + src.substr(nIndex, src.length - nIndex);
    }
  }
  return src;
}

/*
 * 频率控制 返回函数连续调用时，fn 执行频率限定为每多少时间执行一次
 * @param fn {function}  需要调用的函数
 * @param delay  {number}    延迟时间，单位毫秒
 * @param mustRunDelay  {bool} 是否延迟执行，给mustRunDelay参数传递false 绑定的函数先执行，而不是delay后后执行。
 * @return {function}实际调用函数
 */
export function throttle(fn, delay, mustRunDelay, debounce) {
  var curr = +new Date(), //当前事件
    last_call = 0,
    last_exec = 0,
    timer = null,
    diff, //时间差
    context, //上下文
    args,
    exec = function() {
      last_exec = curr;
      fn.apply(context, args);
    };
  if (mustRunDelay == undefined) {
    mustRunDelay = true;
  }
  return function() {
    curr = +new Date();
    (context = this), (args = arguments), (diff = curr - (debounce ? last_call : last_exec) - delay);
    clearTimeout(timer);
    if (debounce) {
      if (mustRunDelay) {
        timer = setTimeout(exec, delay);
      } else if (diff >= 0) {
        exec();
      }
    } else {
      if (diff >= 0) {
        exec();
      } else if (mustRunDelay) {
        timer = setTimeout(exec, -diff);
      }
    }
    last_call = curr;
  };
}

/*
 * 空闲控制 返回函数连续调用时，空闲时间必须大于或等于 delay，fn 才会执行
 * @param fn {function}  要调用的函数
 * @param delay   {number}    空闲时间
 * @param mustRunDelay  {bool} 是否延迟执行，给mustRunDelay参数传递false 绑定的函数先执行，而不是delay后后执行。
 * @return {function}实际调用函数
 */
export function debounce(fn, delay, mustRunDelay) {
  return throttle(fn, delay, mustRunDelay, true);
}

export const REGEXP = {
  /**
   * 手机。
   */
  PHONE: /^(\+\d+)?1[345789]\d{9}$/, ///^(((13[0-9]{1})|(15[0-9]{1})|(14[0-9]{1})|(18[0-9]{1}))+\d{8})$/,

  /**
   * 邮编。
   */
  ZIPCODE: /^[1-9][0-9]{5}$/,

  /**
   * 邮箱。
   */
  EMAIL: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,

  /**
   * 日期。
   */
  DATE: /^(0?[1-9]|1[0-2])-(0?[1-9]|[1-2][0-9]|3[0-1])$/,

  /**
   * 身份证。
   */
  IDCARD: /(^\d{18}$)|(^\d{15}$)|(^\d{17}(\d|X|x)$)/,

  /**
   * VIN码。
   */
  VINCODE: /(?!^\d+$)(?!^[a-zA-Z]+$)[0-9a-zA-Z]{17}/
};

/**
 * 根据是否是iPhoneX返回不同的样式
 * @param iphoneXStyle
 * @param iosStyle
 * @param androidStyle
 * @returns {*}
 */

export function ifIphoneX(iphoneXStyle, iosStyle, androidStyle) {
  if (isIPhpneX) {
    return iphoneXStyle;
  } else if (isIOS) {
    return iosStyle;
  } else {
    if (androidStyle) return androidStyle;
    return iosStyle;
  }
}

/**
 *获取react-native-element元素的宽度和高度等信息
 * @param ref:ref 组件ref
 */

export function getRnElementInfo(ref) {
  const handle = findNodeHandle(ref);
  return new Promise(resolve => {
    UIManager.measure(handle, (x, y, width, height, pageX, pageY) => {
      resolve({
        x,
        y,
        width,
        height,
        pageX,
        pageY
      });
    });
  });
}

function md5(param) {
  return mati;
}

//用于生成uuid
function S4() {
  return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}

export function guid() {
  return S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4();
}

export function objectPour(originO, pourO) {
  let object = {};
  for (let key in originO) {
    if (pourO.hasOwnProperty(key)) {
      object[key] = pourO[key];
    }
  }
  return object;
}

// obj 空值过滤
export function objectFilter(obj) {
  let _newPar = {};
  for (let key in obj) {
    //如果对象属性的值不为空，就保存该属性（这里我做了限制，如果属性的值为0，保存该属性。如果属性的值全部是空格，属于为空。）
    if (
      obj.hasOwnProperty(key) &&
      (obj[key] === 0 || obj[key]) &&
      obj[key].toString().replace(/(^\s*)|(\s*$)/g, '') !== ''
    ) {
      _newPar[key] = obj[key];
    }
  }
  return _newPar;
}
//str 过滤null
export function getStringFilterNull(str) {
  if (Data.isEmpty(str) || 'null' == str) {
    return ''
  } else {
    return str;
  }
}
